package com.liu.dw.controller;

import com.alibaba.fastjson.JSONObject;
import com.liu.dw.common.PageRequest;
import com.liu.dw.common.PageResult;
import com.liu.dw.config.ApiResult;
import com.liu.dw.config.TokenConfig;
import com.liu.dw.entity.Perm;
import com.liu.dw.entity.Role;
import com.liu.dw.service.UsersService;
import com.liu.dw.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @version 1.0
 * @author： LiuWeiGang
 */

@Api(value="用户管理",tags = "用户管理")
@RestController
@RequestMapping("/userMgr/")
public class UsersController {
    @Autowired
    private UsersService usersService;

    @Autowired
    private TokenConfig tokenService;


    //登录验证

    @ApiOperation(value = "用户验证登陆")
    @PostMapping("auth")
    public ApiResult login(HttpServletRequest request, User user) {
//        User loginUser=(User) request.getAttribute("currentUser");
        JSONObject jsonObject = new JSONObject();
        User userForBase = usersService.findByUsername(user);
        if (userForBase == null) {
            jsonObject.put("msg", "登录失败,用户不存在");
            return ApiResult.fail("500","登录失败,用户不存在");

        } else {
            if (!userForBase.getPassword().equals(user.getPassword())) {
                jsonObject.put("msg", "登录失败,密码错误");
                return ApiResult.fail("501","登录失败,密码错误");

            } else {
                String token = tokenService.getToken(userForBase);
                //jsonObject.put("token", token);是为了让前端可以获取到用户登录后JWT生成的token值，
                // 之后的访问都需要带上token，不然其他接口是访问不了的
                jsonObject.put("token", token);
                jsonObject.put("id:", userForBase.getId());
                jsonObject.put("username", userForBase.getUsername());
                jsonObject.put("password", userForBase.getPassword());
                //将数据封装后返回给前端
                return ApiResult.success(jsonObject);
            }
        }
    }



    /**
     * 添加用户
     * 接口：/userMgr/users/
     * 方法：POST
     * 是否需要认证：Y
     */
    @ApiOperation(value = "用户注册")
    @PostMapping("users")
    public ApiResult doSaveObject(UserAddVo users, Integer[] roleIds) {
        usersService.saveObject(users, roleIds);
        return ApiResult.success("用户注册成功!!!!!!!");
    }


    /**
     * 删除用户
     * 接口：/userMgr/user/{用户ID}/
     * 方法：DELETE
     * 是否需要认证：Y
     * 请求参数：
     * 无
     * 返回参数：
     * 无
     */
    @ApiOperation(value = "删除用户")
    @DeleteMapping("user")
    public ApiResult deleteObjects(String[] data) {
        int i = usersService.deleteObjects(data);
        return ApiResult.success(i);


    }

    /**
     * 获取权限列表
     * 接口：/userMgr/perm/
     * 方法：GET
     * 是否需要认证：是
     * 请求参数：
     * 无
     *
     * @return
     */
//    @UserLoginToken
    @ApiOperation(value = "获取权限列表")
    @GetMapping("perm")
    public ApiResult getAllPerm() {
        List<Perm> perms = usersService.getAllPerm();
        return ApiResult.success(perms);
    }


    /**
     * 获取角色列表
     * 接口：/userMgr/role/
     * 方法：GET
     * 是否需要认证：是
     * 请求参数：
     * 无
     *
     * @return
     */
    @ApiOperation(value = "获取角色列表")
    @PostMapping(value = "roles", produces = "application/json; charset=UTF-8")
    public ApiResult findRoleVoPage(@RequestBody PageRequest pageQuery) {
        PageResult page = usersService.findRoleVoPage(pageQuery);
        return ApiResult.success(page);
    }


    /**
     * 获取角色详情
     * 接口：/userMgr/role/{角色ID}
     * 方法：GET
     * 是否需要认证：是
     * 请求参数：
     * 无
     */
    @ApiOperation(value = "获取角色详情")
    @GetMapping("role/{id}")
    public ApiResult getAllRoleVoById(@PathVariable Integer id) {
        List<RoleVo> roleVoById = usersService.getAllRoleVoById(id);
        return ApiResult.success(roleVoById);
    }


    /**
     * 创建角色
     * 接口：/userMgr/role
     * 方法：POST
     * 是否需要认证：Y
     */
    @ApiOperation(value = "添加角色")
    @PostMapping("role")
    public ApiResult saveRoleObject(Role role, Integer[] list) {
        usersService.saveRoleObject(role, list);
        return ApiResult.success("角色添加成功!!!!!!!");
    }


    /**
     * 删除角色
     * 接口：/userMgr/role/{角色id}/
     * 方法：DELETE
     * 是否需要认证：Y
     * 请求参数
     * 无
     */
    @ApiOperation(value = "删除角色")
    @DeleteMapping("role")
    public ApiResult deletePhotoByArray(String[] data) {
        usersService.deletePhotoByArray(data);
        return ApiResult.success("delete ok");
    }


}

